# 支持异步的网络请求模块
import aiohttp
# 异步处理模块
import asyncio
# 解析和操作json的数据
import json, os
# 支持异步的进度条
from tqdm.asyncio import tqdm

# 主页地址
main_url = (
    "https://live.huya.com/liveHttpUI/getLiveList?iGid=4079&iPageNo=1&iPageSize=120"
)

# 伪装
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
}


# 请求主页，async表示支持异步的函数
async def request_index(session):
    # 判断本地是否有json文件，如果有，则返回，如果没有，请求主页
    if os.path.exists("./huya.json"):
        print("采用本地文件")
        with open("huya.json", "r", encoding='utf-8') as f:
            text = json.load(f)
    else:
        async with session.get(url=main_url, headers=headers) as resp:
            # if result.status_code == 200:  # 200表示正常请求
            #     with open("huya.json", "w", encoding="utf-8") as f:
            #         json.dump(result.json(), f, indent="  ", ensure_ascii=False)
            text = await resp.text()
            text = json.loads(text)
    # 返回json中的直播间数据
    return text["vList"]


async def main():
    if not os.path.exists("./image"):
        os.mkdir("./image")
    async with aiohttp.ClientSession() as session:
        data = await request_index(session)
        if data:
            # 初始化进度条
            with tqdm(total=len(data)) as pbar:
                # 生成一个列表，这个列表中是将所有的直播间数据遍历并通过download函数下载的所有对象
                tasks = [download(session, x, pbar) for x in data] # 120个函数
                # 全部启动并等待
                # t1 = asyncio.create_task()
                # await t1
                await asyncio.gather(*tasks)  # *表示解包，拆开列表


async def download(session, data, pbar):
    # 解析传入的直播间的数据，获取图片的名字和图片的url
    k, v = data["sNick"], data["sScreenshot"]
    # 更新进度条的名字
    pbar.set_description(k)
    # 异步请求图片的url并写入到文件中
    async with session.get(v, headers=headers) as resp:
        with open(f"./image/{k}.jpg", "wb") as f:
            f.write(await resp.read())
    pbar.update(1)


import time

start_time = time.time()
asyncio.run(main())
print(time.time() - start_time)
